gl renderer: Render GL textures upside down
authorTimm Bäder <mail@baedert.org>
Thu, 18 Jan 2018 07:21:11 +0000 (08:21 +0100)
committerTimm Bäder <mail@baedert.org>
Thu, 18 Jan 2018 07:21:11 +0000 (08:21 +0100)
These come from an FBO so we need to flip the texture coords on the y
axis, just like we do everywhere else.

gsk/gl/gskglrenderer.c

index 7dfa0126c12d513c8821b93cb7efb626b3156fe2..71ba645aeb1d7c19399f64c532816b6a019af537 100644 (file)
@@ -584,9 +584,12 @@ render_color_node (GskGLRenderer       *self,
 static inline void
 render_texture_node (GskGLRenderer       *self,
                      GskRenderNode       *node,
-                     RenderOpBuilder     *builder,
-                     const GskQuadVertex *vertex_data)
+                     RenderOpBuilder     *builder)
 {
+  const float min_x = builder->dx + node->bounds.origin.x;
+  const float min_y = builder->dy + node->bounds.origin.y;
+  const float max_x = min_x + node->bounds.size.width;
+  const float max_y = min_y + node->bounds.size.height;
   GdkTexture *texture = gsk_texture_node_get_texture (node);
   int gl_min_filter = GL_NEAREST, gl_mag_filter = GL_NEAREST;
   int texture_id;
@@ -599,7 +602,31 @@ render_texture_node (GskGLRenderer       *self,
                                                       gl_mag_filter);
   ops_set_program (builder, &self->blit_program);
   ops_set_texture (builder, texture_id);
-  ops_draw (builder, vertex_data);
+
+  if (GDK_IS_GL_TEXTURE (texture))
+    {
+      ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
+        { { min_x, min_y }, { 0, 1 }, },
+        { { min_x, max_y }, { 0, 0 }, },
+        { { max_x, min_y }, { 1, 1 }, },
+
+        { { max_x, max_y }, { 1, 0 }, },
+        { { min_x, max_y }, { 0, 0 }, },
+        { { max_x, min_y }, { 1, 1 }, },
+      });
+    }
+  else
+    {
+      ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
+        { { min_x, min_y }, { 0, 0 }, },
+        { { min_x, max_y }, { 0, 1 }, },
+        { { max_x, min_y }, { 1, 0 }, },
+
+        { { max_x, max_y }, { 1, 1 }, },
+        { { min_x, max_y }, { 0, 1 }, },
+        { { max_x, min_y }, { 1, 0 }, },
+      });
+    }
 }
 
 static inline void
@@ -2113,7 +2140,7 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
     break;
 
     case GSK_TEXTURE_NODE:
-      render_texture_node (self, node, builder, vertex_data);
+      render_texture_node (self, node, builder);
     break;
 
     case GSK_CAIRO_NODE: